﻿using System;
using BadgeManager.Model;

namespace BadgeManager.Controller
{
    public class ctrlAccessi
    {
        public Persona Persona { get; set; }

        public enum eAccesso
        {
            Successo,
            TesseraInesistente,
            TesseraNonAbilitata,
            TesseraNonAssociata,
            TesseraAssociataAdAttivitaNonValida
        }

        #region "Metodi"

        public void RegistraEntrata(Tessera tessera,
            bool successo, eAccesso note, Persona persona = null, string codice = null)
        {
            StoricoEntrata StoricoEntrata = new StoricoEntrata();
            StoricoEntrata.CodiceTessera = tessera.Codice;
            StoricoEntrata.Successo = successo;
            StoricoEntrata.DataEntrata = DateTime.Now.Date;
            StoricoEntrata.Ora = DateTime.Now.TimeOfDay;
            StoricoEntrata.Note = note.ToString();

            if (persona != null)
            {
                StoricoEntrata.NomePersona = persona.Nome;
                StoricoEntrata.CognomePersona = persona.Cognome;
            }

            //verificare se è un'entrata o un'uscita
            if (new ctrlStoricoEntrate().SeEntrato(StoricoEntrata))
                StoricoEntrata.TipologiaStorico = "U";
            else
                StoricoEntrata.TipologiaStorico = "E";

            new ctrlStoricoEntrate().Inserisci(StoricoEntrata);
        }

        public void EseguiAccesso(string codice)
        {
            ctrlTessera ctrlTessera = new ctrlTessera();
            //BadgeManager.Controller.ctrlAccessi cAccessi = new BadgeManager.Controller.ctrlAccessi();
            Tessera tessera = new Tessera();
            try
            {
                ctrlTessera.ControlloTessera(ref tessera, codice);
            }
            catch (TesseraNuovaExeption ex) // Da Verificare
            {
                RegistraEntrata(tessera, false, ctrlAccessi.eAccesso.TesseraInesistente, Persona, codice);
                throw ex;
            }
            catch (TesseraAttivaInUnCorsoException ex) // OK
            {
                Persona = ctrlTessera.GetPersonaByTessera(tessera.Id);
                RegistraEntrata(tessera, true, ctrlAccessi.eAccesso.Successo, Persona);
                throw ex;
            }
            catch (RiciclareCorsoFinitoException ex) // OK
            {
                Persona = ctrlTessera.GetPersonaByTessera(tessera.Id);
                RegistraEntrata(tessera, false, ctrlAccessi.eAccesso.TesseraAssociataAdAttivitaNonValida, Persona);
                throw ex;
            }
            catch (TesseraNonAbilitata ex) // Da Verificare
            {
                Persona = ctrlTessera.GetPersonaByTessera(tessera.Id);
                RegistraEntrata(tessera, false, ctrlAccessi.eAccesso.TesseraNonAbilitata, Persona);
                throw ex;
            }
            catch (TesseraEsistenteMaNonAssociata ex) // Da Verificare
            {
                Persona = ctrlTessera.GetPersonaByTessera(tessera.Id);
                RegistraEntrata(tessera, false, ctrlAccessi.eAccesso.TesseraNonAssociata, Persona);
                throw ex;
            }
        }

        #endregion "Metodi"
    }
}